<!DOCTYPE html>
<html lang="en">
<head>
    <meta  http-equiv="content-type" content="text/html" charset="utf-8"/>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        /**
         * 原型概念：原型对象里的属性和方法被所有实例所共享，相当于java中的static
         * 因此存在问题：实例改变原型对象中的属性之后，别的对象再访问时是改变之后的
         * 解决办法：构造函数和原型模式组合使用
         */
        //构造函数式
        function Person(name,age,friends,job){
            this.name = name;
            this.age = age;
            this.friends = friends;
            this.job = job;
        }
        //简单原型
        Person.prototype = {
            constructor:Person,
            sayName:function(){
                alert(this.name);
            }
        }
        var p1 = new Person('za',20,['ss','ssf','jhj'],'boss');

        var p2 = new Person('er',20,['svvs','svvvsf','jvvvhj'],'bovvss');

        alert(p1.friends);
        p1.sayName();
        alert(p2.friends);
        p2.sayName();

        /**
         * 动态原型模式：让你的代码都封装到一起
         */
        function Person(name,age,friends,job){
            this.name = name;
            this.age = age;
            this.friends = friends;
            this.job = job;
            //动态原型方法,如果是判断constructor,则是Function
            if(typeof this.sayName()!= 'function'){
                Person.prototype.sayName = function(){
                        alert(this.name);
                }
            }
        }


        /**
         * 稳妥构造函数式：durable object(稳妥对象)   非常安全的环境中
         * 特点：没有公共属性；不能使用this对象
         */

        function Person(name,age,job){
            //创建一个对象
            var obj = new Object();
            //定义私有的函数和属性  private
            var sex = '男';
            var saySex = function (){};

            //添加一个方法
            obj.sayName = function(){
                alert(name);
            }
            return obj;
        }
        var p = new Person('zs',90,'boss');
        p.sayName();//p对象只能通过该方法访问name 属性

    </script>
</head>
<body>

</body>
</html>